home *** CD-ROM | disk | FTP | other *** search
/ Isometric Game Programming with DirectX 7.0 / Isometric Game Programming.iso / source / chapter25 / isohex25_1 / isohex25_1.cpp < prev    next >
C/C++ Source or Header  |  2000-11-26  |  7KB  |  287 lines

  1. /*****************************************************************************
  2. IsoHex24_1.cpp
  3. Ernest S. Pazera
  4. 17NOV2000
  5. Start a WIN32 Application Workspace, add in this file
  6. Needs ddraw.lib, d3d8.lib and dxguid.lib
  7. Needs GDICanvas.h/cpp
  8. Needs DDFuncs.h/cpp
  9. Needs D3DFuncs.h/cpp
  10. *****************************************************************************/
  11.  
  12. //////////////////////////////////////////////////////////////////////////////
  13. //INCLUDES
  14. //////////////////////////////////////////////////////////////////////////////
  15. #define WIN32_LEAN_AND_MEAN  
  16.  
  17. #include <windows.h>   
  18. #include <math.h>//sin and cos
  19. #include "GDICanvas.h"
  20. #include "ddraw.h"
  21. #include "DDFuncs.h"
  22. #include "d3d.h"
  23. #include "d3dfuncs.h"
  24.  
  25. //////////////////////////////////////////////////////////////////////////////
  26. //DEFINES
  27. //////////////////////////////////////////////////////////////////////////////
  28. //name for our window class
  29. #define WINDOWCLASS "ISOHEX25"
  30. //title of the application
  31. #define WINDOWTITLE "IsoHex 25-1"
  32.  
  33. //screen attributes
  34. const DWORD SCREENWIDTH=640;
  35. const DWORD SCREENHEIGHT=480;
  36. const DWORD SCREENBPP=16;
  37.  
  38. //////////////////////////////////////////////////////////////////////////////
  39. //PROTOTYPES
  40. //////////////////////////////////////////////////////////////////////////////
  41. bool Prog_Init();//game data initalizer
  42. void Prog_Loop();//main game loop
  43. void Prog_Done();//game clean up
  44.  
  45. //////////////////////////////////////////////////////////////////////////////
  46. //GLOBALS
  47. //////////////////////////////////////////////////////////////////////////////
  48. HINSTANCE hInstMain=NULL;//main application handle
  49. HWND hWndMain=NULL;//handle to our main window
  50.  
  51. //IDirectDraw7 Pointer
  52. LPDIRECTDRAW7 lpdd=NULL;
  53.  
  54. //surfaces
  55. LPDIRECTDRAWSURFACE7 lpddsPrime=NULL;
  56. LPDIRECTDRAWSURFACE7 lpddsBack=NULL;
  57.  
  58. //IDirect3D7
  59. LPDIRECT3D7 lpd3d=NULL;
  60.  
  61. //IDirect3DDevice
  62. LPDIRECT3DDEVICE7 lpd3ddev=NULL;
  63.  
  64. //vertices
  65. D3DTLVERTEX vert[3];//three vertices
  66.  
  67. //////////////////////////////////////////////////////////////////////////////
  68. //WINDOWPROC
  69. //////////////////////////////////////////////////////////////////////////////
  70. LRESULT CALLBACK TheWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  71. {
  72.     //which message did we get?
  73.     switch(uMsg)
  74.     {
  75.     case WM_KEYDOWN:
  76.         {
  77.             //check for escape key
  78.             if(wParam==VK_ESCAPE)
  79.             {
  80.                 DestroyWindow(hWndMain);
  81.             }
  82.  
  83.             return(0);//handled message
  84.         }break;
  85.     case WM_DESTROY://the window is being destroyed
  86.         {
  87.  
  88.             //tell the application we are quitting
  89.             PostQuitMessage(0);
  90.  
  91.             //handled message, so return 0
  92.             return(0);
  93.  
  94.         }break;
  95.     case WM_PAINT://the window needs repainting
  96.         {
  97.             //a variable needed for painting information
  98.             PAINTSTRUCT ps;
  99.             
  100.             //start painting
  101.             HDC hdc=BeginPaint(hwnd,&ps);
  102.  
  103.             /////////////////////////////
  104.             //painting code would go here
  105.             /////////////////////////////
  106.  
  107.             //end painting
  108.             EndPaint(hwnd,&ps);
  109.                         
  110.             //handled message, so return 0
  111.             return(0);
  112.         }break;
  113.     }
  114.  
  115.     //pass along any other message to default message handler
  116.     return(DefWindowProc(hwnd,uMsg,wParam,lParam));
  117. }
  118.  
  119.  
  120. //////////////////////////////////////////////////////////////////////////////
  121. //WINMAIN
  122. //////////////////////////////////////////////////////////////////////////////
  123. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
  124. {
  125.     //assign instance to global variable
  126.     hInstMain=hInstance;
  127.  
  128.     //create window class
  129.     WNDCLASSEX wcx;
  130.  
  131.     //set the size of the structure
  132.     wcx.cbSize=sizeof(WNDCLASSEX);
  133.  
  134.     //class style
  135.     wcx.style=CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  136.  
  137.     //window procedure
  138.     wcx.lpfnWndProc=TheWindowProc;
  139.  
  140.     //class extra
  141.     wcx.cbClsExtra=0;
  142.  
  143.     //window extra
  144.     wcx.cbWndExtra=0;
  145.  
  146.     //application handle
  147.     wcx.hInstance=hInstMain;
  148.  
  149.     //icon
  150.     wcx.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  151.  
  152.     //cursor
  153.     wcx.hCursor=LoadCursor(NULL,IDC_ARROW);
  154.  
  155.     //background color
  156.     wcx.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  157.  
  158.     //menu
  159.     wcx.lpszMenuName=NULL;
  160.  
  161.     //class name
  162.     wcx.lpszClassName=WINDOWCLASS;
  163.  
  164.     //small icon
  165.     wcx.hIconSm=NULL;
  166.  
  167.     //register the window class, return 0 if not successful
  168.     if(!RegisterClassEx(&wcx)) return(0);
  169.  
  170.     //create main window
  171.     hWndMain=CreateWindowEx(0,WINDOWCLASS,WINDOWTITLE, WS_POPUP | WS_VISIBLE,0,0,320,240,NULL,NULL,hInstMain,NULL);
  172.  
  173.     //error check
  174.     if(!hWndMain) return(0);
  175.  
  176.     //if program initialization failed, then return with 0
  177.     if(!Prog_Init()) return(0);
  178.  
  179.     //message structure
  180.     MSG msg;
  181.  
  182.     //message pump
  183.     for(;;)    
  184.     {
  185.         //look for a message
  186.         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  187.         {
  188.             //there is a message
  189.  
  190.             //check that we arent quitting
  191.             if(msg.message==WM_QUIT) break;
  192.             
  193.             //translate message
  194.             TranslateMessage(&msg);
  195.  
  196.             //dispatch message
  197.             DispatchMessage(&msg);
  198.         }
  199.  
  200.         //run main game loop
  201.         Prog_Loop();
  202.     }
  203.     
  204.     //clean up program data
  205.     Prog_Done();
  206.  
  207.     //return the wparam from the WM_QUIT message
  208.     return(msg.wParam);
  209. }
  210.  
  211. //////////////////////////////////////////////////////////////////////////////
  212. //INITIALIZATION
  213. //////////////////////////////////////////////////////////////////////////////
  214. bool Prog_Init()
  215. {
  216.     lpdd=LPDD_Create(hWndMain,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT);
  217.  
  218.     //set the display mode
  219.     lpdd->SetDisplayMode(SCREENWIDTH,SCREENHEIGHT,SCREENBPP,0,0);
  220.  
  221.     //create primary surface
  222.     lpddsPrime=LPDDS_CreatePrimary3D(lpdd,1);
  223.  
  224.     //create back buffer
  225.     lpddsBack=LPDDS_GetSecondary3D(lpddsPrime);
  226.     
  227.     //get the idirect3d pointer
  228.     lpd3d=LPD3D_Create(lpdd);
  229.  
  230.     //create the idirect3ddevice(hack method)
  231.     lpd3ddev=LPD3DDEV_Create(lpd3d,lpddsBack);
  232.  
  233.     //set up viewport
  234.     LPD3DDEV_SetViewport(lpd3ddev,0,0,SCREENWIDTH,SCREENHEIGHT);
  235.  
  236.     //////////////////////////////////
  237.     //extra setup goes here
  238.     //////////////////////////////////
  239.  
  240.     return(true);//return success
  241. }
  242.  
  243. //////////////////////////////////////////////////////////////////////////////
  244. //CLEANUP
  245. //////////////////////////////////////////////////////////////////////////////
  246. void Prog_Done()
  247. {    
  248.     //////////////////////////////////
  249.     //extra cleanup goes here
  250.     //////////////////////////////////
  251.  
  252.     //release IDirect3DDevice
  253.     LPD3DDEV_Release(&lpd3ddev);
  254.  
  255.     //release IDirect3D 
  256.     LPD3D_Release(&lpd3d);
  257.  
  258.     //clean up primary surface(this will clean up the back buffer, also)
  259.     LPDDS_Release(&lpddsPrime);
  260.  
  261.     //clean up the dd pointer
  262.     LPDD_Release(&lpdd);
  263. }
  264.  
  265. //////////////////////////////////////////////////////////////////////////////
  266. //MAIN GAME LOOP
  267. //////////////////////////////////////////////////////////////////////////////
  268. void Prog_Loop()
  269. {
  270.     //clear the viewport to black
  271.     lpd3ddev->Clear(0,NULL,D3DCLEAR_TARGET,0,0,0);
  272.  
  273.     //start the scene
  274.     lpd3ddev->BeginScene();
  275.  
  276.     //////////////////////////////////
  277.     //rendering code goes here
  278.     //////////////////////////////////
  279.  
  280.     //end the scene
  281.     lpd3ddev->EndScene();
  282.  
  283.     //flip 
  284.     lpddsPrime->Flip(NULL,DDFLIP_WAIT);
  285. }
  286.  
  287.